# _*_conding:cp-1252-*-
# 教育机构：银杰教育
# 讲师：李伟
# 开发时间：2025/8/31 上午12:46
"""
for循环实现每一条的遍历去执行测试用例的结果：
问题1： 虽然运行了每一条用例，但是不管执行了几条 在pytest框架里都是统计为一条用例
问题2： 第一条用例执行完 报错了 后面的用例不会再执行了。 导致用例之间不是独立的。
预期效果： 每条用例单独执行 并单独记录结果。相互失败了不会影响。使用DDT。
"""
import pytest
from tools.handle_logs import logger

# 案例
def login(username,password):
    if username != "13100009999":
        return "用户名错误"
    if password !="123456":
        return "密码错误"
    return "登录成功"

data_all = [{"name":"13100009999","pwd":"123456","expect":"登录成功"},
            {"name":"lemon1","pwd":"123456","expect":"用户名错误"},
            {"name":"13100009999","pwd":"1234","expect":"密码错误"}]

@pytest.mark.parametrize("data",data_all)  #注意这里的"data" 是字符串格式 接收测试data_all
def test_login(data):
    try:
        result = login(data["name"],data["pwd"])
        logger.info(f'实际输入参数 用户名:{data["name"]} 密码:{data["pwd"]}')
        assert result == data["expect"],f"断言失败{result} !={data['expect']}"
        logger.info(f'实际输出 {result} 用户名:{data["name"]} 密码:{data["pwd"]}')
    except AssertionError as err:
        logger.error(f"断言失败{data['expect']} !={data['expect']}")
        raise err



# 总结：上述@pytest.mark.parametrize("data",data_all)  #注意这里的"data" 是字符串格式 接收测试data_all

# # 类的形式写用例 --实现DDT  装饰器写在类上面，针对类下面的每个方法都会实现数据驱动。
# @pytest.mark.parametrize("data",data_all)
# class TestDemoDDT:
#     def test_01(self,data):
#         result = login(data["name"], data["pwd"])  # 执行结果
#         assert result == data["expect"]
#     def test_02(self,data):
#         result = login(data["name"], data["pwd"])  # 执行结果
#         assert result == data["expect"]
#
# # 类的形式写用例 --实现DDT 装饰器写在方法上面  只针对这个方法生效， 另外方法不能实现数据驱动。
# class TestDemo1DDT:
#     @pytest.mark.parametrize("data", data_all)
#     def test_01(self,data):
#         result = login(data["name"], data["pwd"])  # 执行结果
#         assert result == data["expect"]
#
#     def test_02(self,data):
#         result = login(data["name"], data["pwd"])  # 执行结果
#         assert result == data["expect"]
#     # 报错：无法发现data


# 装饰器中的 "case" 是参数名的定义（字符串形式），用于关联测试数据和函数参数；
# 函数中的 case 是实际接收数据的变量，用于在测试逻辑中引用参数化的数据。
# 两者名称必须一致，才能让 pytest 正确将 case_result 中的数据传递到测试函数中。